package com.guosong.rabbitmq.helloworld;

import com.guosong.rabbitmq.utils.RabbitConstant;
import com.guosong.rabbitmq.utils.RabbitUtils;
import com.rabbitmq.client.*;

import java.io.IOException;

public class Consumer {

    public static void main(String[] args) throws IOException {
        //获取TCP长连接
        Connection conn = RabbitUtils.getConnection();
        //创建通信"通信通道"，相当于TCP中的虚拟连接
        Channel channel = conn.createChannel();
        //创建队列，声明并创建一个队列，如果队列已经存在，则使用这个队列
        //第一个参数：队列的名称ID
        //第二哥参数：是否持久化，false对应不持久化数据，MQ停掉数据就会丢失
        //第三哥参数：是否队列私有化，false则代表所有消费者都可以访问，
        // true代表只有第一次拥有它的消费者才能使用，其他消费者不让访问
        //第四个参数：是否自动删除，false代表连接停掉后不会不会自动删除这个队列
        //其他额外参数 ，null
        channel.queueDeclare(RabbitConstant.QUEUE_HELLOWORLD,false,false,false,null);
        //从MQ服务器中获取到数据
        //创建一个消息消费者
        //第一个参数：队列名字
        //第二个参数代表是否自动确认收到消息，false代表手动编程来确认消息，这是MQ推荐的做法
        //第三个参数要传入DefaultConsumer的实现类
        channel.basicConsume(RabbitConstant.QUEUE_HELLOWORLD,false,new Receiver(channel));

    }



}
class Receiver extends DefaultConsumer{


    private Channel channel;
    public Receiver(Channel channel) {
        super(channel);
        this.channel=channel;

    }

    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        String message = new String(body);
        System.out.println("消费者接收到的消息"+message);
        System.out.println("消息的TagId:"+envelope.getDeliveryTag());
        //false只确认签收当前的消息，设置true的时候则代表签收该消费者所有未签收的消息
        channel.basicAck(envelope.getDeliveryTag(),false);


    }
}


